package com.ideaaedi.springcloud.jd.user.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.ideaaedi.springcloud.jd.commonds.entity.PageInfo;
import com.ideaaedi.springcloud.jd.commonds.entity.user.po.SysMenuPO;
import com.ideaaedi.springcloud.jd.commonds.entity.user.vo.req.SysMenuAddReqVO;
import com.ideaaedi.springcloud.jd.commonds.entity.user.vo.req.SysMenuBatchAddReqVO;
import com.ideaaedi.springcloud.jd.commonds.entity.user.vo.req.SysMenuListAllVO;
import com.ideaaedi.springcloud.jd.commonds.entity.user.vo.req.SysMenuListReqVO;
import com.ideaaedi.springcloud.jd.commonds.entity.user.vo.req.SysMenuUpdateReqVO;
import com.ideaaedi.springcloud.jd.commonds.entity.user.vo.resp.SysMenuDetailRespVO;
import com.ideaaedi.springcloud.jd.commonds.entity.user.vo.resp.SysMenuListRespVO;
import org.springframework.lang.NonNull;
import org.springframework.lang.Nullable;

import java.util.Set;

/**
 * <p>
 * 系统-菜单表（资源组表） 服务类
 * </p>
 *
 * @author <font size = "20" color = "#3CAA3C"><a href="https://gitee.com/JustryDeng">JustryDeng</a></font> <img src="https://gitee.com/JustryDeng/shared-files/raw/master/JustryDeng/avatar.jpg" />
 * @since 2021.0.1.A
 */
public interface SysMenuService extends IService<SysMenuPO> {
    
    /**
     * 列表
     *
     * @param req 参数
     *
     * @return 菜单列表
     */
    PageInfo<SysMenuListRespVO> list(SysMenuListReqVO req);
    
    /**
     * 查询所有菜单（当前业务租户下）
     *
     * @param req 参数
     *
     * @return 菜单列表
     */
    PageInfo<SysMenuListRespVO> listAll(SysMenuListAllVO req);
    
    /**
     * 详情
     *
     * @param menuId 菜单id
     *
     * @return 菜单详情
     */
    SysMenuDetailRespVO detail(Long menuId);
    
    /**
     * 更新
     *
     * @param req 参数
     *
     * @return 更新后的菜单详情
     */
    SysMenuDetailRespVO update(SysMenuUpdateReqVO req);
    
    /**
     * 新增
     *
     * @param req 参数
     * @param queryDetail true-查询详情并返回； false-不查询详情，但是会将id放进模型中进行返回
     *
     * @return 新增的菜单详情
     */
    SysMenuDetailRespVO add(SysMenuAddReqVO req, boolean queryDetail);
    
    /**
     * 批量新增
     *
     * @param req
     *         参数
     */
    void batchAdd(SysMenuBatchAddReqVO req);
    
    /**
     * 删除
     *
     * @param menuId 部门id
     *
     * @return 删除了的菜单详情
     */
    SysMenuDetailRespVO delete(Long menuId);
    
    /**
     * 删除指定租户下的所有菜单
     *
     * @param tenant 租户值（不指定则自动获取）
     */
    void deleteByTenant(String tenant);
    
    /**
     * 获取角色拥有的所有菜单的id
     *
     * @param roleIdSet 角色id集合
     *
     * @return  角色拥有的所有菜单的id
     */
    @NonNull
    Set<Long> loadMenuIdByRoleIds(@Nullable Set<Long> roleIdSet);
}
